// 这个函数即为题目中的loadData，这里用promiseMaker模拟loadData 用来测试代码运行结果
function promiseMaker(time) {
  return new Promise(res => setTimeout(() => res(time), time));
}

const urls = [10, 100, 0, 1000, 7, 5, 900, 1500, 280, 890];

// 题目要求的方法
function getData(arr, limit) {
  // 将url数组里的地址字符串转化为{key,value}的形式，固化index方便按url顺序输出结果
  let urlMessage = arr.map((item, index) => ({ key: index, value: item }));

  // 定义一个数组用来存放正在执行的promise对应的url信息
  let requestingArr = [];

  // 存放loadData的返回值
  let result = [];

  return new Promise((resolve, reject) => {
    // 将loadData请求响应后的结果存入result中，将该任务对应的url信息从requestingArr中删除，并开启一个新的loadData任务
    function addData(response, index) {
      result[index] = response;
      requestingArr = requestingArr.filter(item => item.key !== index);
      if(requestingArr.length === 0) { 
        resolve(result);
        return;
      }
      startRequest();
    }

    // 开启一个新的loadData任务,并将该任务对应的url信息存入requestingArr中
    function startRequest() {
      if(urlMessage.length === 0) return;
      let url = urlMessage.shift();
      promiseMaker(url.value).then(response => addData(response, url.key), reason => addData(reason, url.key));
      requestingArr.push(url);
    }

    // 开启最多为limit数量的loadData任务
    while (requestingArr.length < limit) {
      startRequest();
    }
  })
}

getData(urls, 3).then(value => console.log(value))
